/*
 * ==================================================
 * 项目开发者：JerryStark
 * 开发者Email：4771007@qq.com
 * 开发者QQ:4771007
 * 开发范围：web，wap，android,ios,osx or win or linux 应用
 * ==================================================
 */
package RTGame.GetGames;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author jerry
 */
abstract public class scan_public {

    /**
     * 列表规则组
     */
    public JsonArray ListRule;

    /**
     * 键值规则组
     */
    public JsonArray DataRule;

    /**
     * 统一使用的临时数据记录
     */
    public Object TempData;

    /**
     * 最终要返回的数据
     */
    public JsonObject BackData = new JsonObject();

    /**
     * 公共开始方法
     * <br>外部就调用者一个方法
     * <br>内部得到的结果最终返回
     *
     * @param HttpString html字符串
     * @param list_rule 获得数据列的规则组
     * @param data_rule 获取数据键值的规则组,组中返回的数据的key由这里定
     * @return 返回得到的数据json对象
     */
    public JsonObject Start(String HttpString, JsonArray list_rule, JsonArray data_rule) {

        ListRule = list_rule;
        DataRule = data_rule;

        //按照页面类型格式化对应的数据
        TempData = FormatString(HttpString);
        //循环执行数据列表获取的规则
        FindList();

        FindData();
        System.out.println(BackData);
        //执行列表规则
        return BackData;
    }

    /**
     * 按照列表规则循环执行方法
     * <br>最终返回json数据
     *
     */
    protected void FindList() {

        //检查规则列表
        Iterator<JsonElement> ite = ListRule.iterator();
        while (ite.hasNext()) {
            JsonElement next = ite.next();

            //为空就跳过
            if (next.getAsString().equals("")) {
                continue;
            }
            //切割出方法名和参数
            JsonObject one_fun_conf = ScanFunctions(next.getAsString());
            //执行方法
            StartFonction(one_fun_conf);
        }
    }

    /**
     * 按照数据规则循环执行方法
     */
    protected void FindData() {

        //检查规则列表
        Iterator<JsonElement> ite = DataRule.iterator();
        while (ite.hasNext()) {
            JsonElement next = ite.next();
            //为空就跳过
            if (next.getAsString().equals("")) {
                continue;
            }
            //切割出方法名和参数
            JsonObject one_fun_conf = ScanFunctions(next.getAsString());
            //执行方法
            StartFonction(one_fun_conf);
        }
    }

    /**
     * 把一条配置,切割出方法名称和参数
     *
     * @param one_rule
     * @return
     */
    protected JsonObject ScanFunctions(String one_rule) {
        //传入进来的是字符串,这里切割出方法名和参数
        String[] string_split = one_rule.split("\\=");
        String function_name = string_split[0];
        //再获得参数列表
        String parm_list = "";
        if (string_split.length > 1) {
            //切割参数
            parm_list = string_split[1];
        }
        JsonObject back_fun_conf = new JsonObject();
        back_fun_conf.addProperty("fun_name", function_name);
        back_fun_conf.addProperty("parm_list", parm_list);
        return back_fun_conf;
    }

    /**
     * 开始动态执行一个方法
     *
     * @param function_conf
     */
    protected void StartFonction(JsonObject function_conf) {

        try {
            //动态执行一个方法
            Method obj = this.getClass().getMethod(
                    function_conf.get("fun_name").getAsString()//方法名称
                    , String.class
            );
            //执行
            obj.invoke(this, function_conf.get("parm_list").getAsString());

        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            Logger.getLogger(scan_public.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * 把参数字符切割成数组
     *
     * @param confString
     * @return
     */
    protected String[] GetParms(String confString) {
        //先把\,\替换掉
        confString = confString.replace("\\,", "{#}");
        String[] conf_split = confString.split(",");
        for (int i = 0; i < conf_split.length; i++) {
            conf_split[i] = conf_split[i].replace("{#}", ",");
        }
        return conf_split;
    }

    /**
     * 按照页面的类型用不同的方式格式化数据,最终返回通用的object
     *
     * @param HttpString 网页内容
     * @return
     */
    abstract protected Object FormatString(String HttpString);

}
